//日期类
public class Date {
    //属性
    public int year;
    public int month;
    public int day;

    //行为
    public void setDate1(/*Date this,*/int y,int m,int d){//建立日期
        this.year = y;
        this.month = m;
        this.day = d;
    }//这也可以进行this

    public void setDate2(int year,int month,int day){//建立日期
        year = year;
        month = month;
        day = day;
    }//这个时候的打印全是0年0月0日
    //就近访问原则：局部变量优先自己给自己赋值，那么也就是在虚拟机栈上中自己给自己赋值
    //通过new关键字定义，我们明白date在虚拟机栈上来创建栈帧
    //实例化的对象被创建并储存在堆上

    //结论2：当形参与成员变量名相同时，会造成局部变量优先赋值


    //这个时候就是这两个变量不一样，就如同上面setDate1一样，要么就是如同setDate3一样使用this
    public void setDate3(int year,int month,int day){//建立日期
        this.year = year;
        this.month = month;
        this.day = day;
    }
    //this是对当前对象的引用，建议我们习惯使用this
    public void printDate(){//打印日期
        System.out.println(this.year+"年"+this.month+"月"+this.day+"日");
        //结论3：所以让我们自己可以充分地了解的那一个方法是调用哪一个对象，我们通常在其中会加入this来进行引用，所有的
    }

    public static void main(String[] args) {
        Date date = new Date();
        date.setDate2(2005,12,19);
        System.out.println("她的生日是：");
        date.printDate();//调用这个方法
        date.setDate1(2005,12,19);
        date.printDate();

        System.out.println("==============");

        Date date2 = new Date();
        date2.setDate1(2005,07,26);
        date2.printDate();
        //那么这个时候有多个set方法,那么这个时候谁调用了当前的setDate方法,那么谁就是使用this
        //并且编译器会把我们隐藏一个变量交做Date this，所以就会表明了这个this就是这个

        //结论1：通过this可以访问当前对象的成员属性/成员变量【静态成员变量不支持】
        //this引用指向当前对象(成员方法运行时调用该成员方法的对象)，在成员方法中所有成员变量的操作，都是通过该
        //引用去访问。

        //1. this的类型：对应类类型引用，即哪个对象调用就是哪个对象的引用类型
        //2. this只能在"成员方法"中使用
        //3. 在"成员方法"中，this只能引用当前对象，不能再引用其他对象
        //4. this是“成员方法”第一个隐藏的参数，编译器会自动传递，在成员方法执行时，编译器会负责将调用成员方法
        //对象的引用传递给该成员方法，this负责来接收
    }
}
